#include "utils.h"

/**
 * 打印一句话
*/
void printTest()
{
    printf("调用test"); //打印一句话
}

/**
 *  接收用户输入
*/
void clsTest()
{
    string str2 = "asdasd";
    cin >> str2; //接受控制台输入
}

/**
 *  常用命令
*/
void common()
{
    // 设置控制台颜色
    system("color 13");
    // 打印输出
    printf("这是一个测试关于printf!\n");
    // 命令行暂停
    system("pause");
    // 打开一张图片
    system("C:\\Users\\Administrator\\Desktop\\2020-11-27_135427.png");
    //查看数据类型占用内存大小
    sizeof(short);
}

/**
 *  指针练习
*/
void pointerTest()
{
    // 1.定义指针
    int a = 10;
    // 指针定义的语法：数据类型 *指针变量名
    int *p = &a;

    cout << p << endl;  //打印指针地址
    cout << *p << endl; //打印指针内容的值
    *p = 200;           //修改指针内容
    cout << *p << endl; //打印指针内容的值
}

/**
 *  空指针 和 野指针
 *  1.空指针用于给 变量进行初始化
 *  2.0~255 之间的内存编号是系统占用的，所以不可以访问
*/
void emptyPointerTest()
{
    int *p = NULL; //空指针
    *p = 100;
    int *a = (int *)0x11100; //野指针
}

/**
 *  const 修饰指针
 *  1.const 修饰指针 
 *  2.const 修饰常量
 *  3.const 既修饰指针，有修饰常量
*/
void test1()
{
    int a = 10;
    int b = 20;
    const int *p = &a;

    // const int *p = &a;                   //指针的值不可以改
    // int *const p = &a;                   //指针的指向不可以改
    // const int *const p = &a;             //指针的指向和指针的值都不可以改
    cout << *p << endl;
}

/**
 *  //指针和数组
 *  //利用指针访问数组中的元素
*/
void test2()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int len = sizeof(arr) / sizeof(arr[0]);
    int *p = arr; //arr就是数组首地址
    for (int i = 0; i < len; i++)
    {
        cout << *p << endl; //输出指针
        p++;                //指针偏移
    }
}

/**
 *  指针和函数
 *  1.值传递
 *  2.地址传递
 *   如果是地址传递可以修饰我们的实参
*/
void swap02(int *p1, int *p2)
{
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
void test3()
{
    int a = 10;
    int b = 20;

    // 地址传递
    swap02(&a, &b);
    cout << a << endl;
    cout << b << endl;
}

/**
 *  结构体
 *  
*/
struct Student
{
    string name;
    int age;
    int score;
} s3; //直接创建个结构体实例
void test4()
{
    // struct 关键字可以省略
    Student s1;
    s1.name = "小红";
    s1.age = 10;
    s1.score = 100;

    Student s2 = {"小明", 10, 100};

    s3.name = "小李";
    s3.age = 10;
    s3.score = 100;

    Student array[3] =
        {
            {"小明", 10, 100},
            {"小红", 20, 100},
            {"小白", 30, 100}};
    int length = sizeof(array) / sizeof(array[0]);
    for (int i = 0; i < length; i++)
    {
        cout << array[i].name << endl; //输出指针
    }
}

/**
 *  指针访问结构体
 *  
*/
void test5()
{
    Student s1 = {"小明", 10, 100};
    Student *p = &s1; //指针访问
    p->name;          //通过指针访问数据
}

/**
 *  结构体嵌套结构体
 *  
*/
struct Student2
{
    string name;
    int age;
    int score;
};
struct teacher
{
    int id;
    string name;
    Student2 stu;
};
// 值传递
void printStudent(Student2 s)
{
}
// 地址传递
void printStudent2(const Student2 *p) //加入const之后不可修改值
{
}
void test6()
{
    Student2 s;
    s.name = "asd";
    printStudent(s);
    printStudent2(&s);
}
